/*
author: yiliangwu880
可以从 git@gitee.com:yiliangwu880/svr_util.git 获取更多的参考。
延时，下个系统调用再执行函数
应用场景：比如PlayerMgr 拥有player, Player::Fun 里面需要调用 PlayerMgr::Ins().delPlayer(); 由于当前调用位置在Player方法，不能马上调用，避免野Player操作。
code example:
	
	auto f=[](){  //注意延时后，你的传入对象生存期是否有效！！
		Player* player = PlayerMgr::Ins().Find(id);
		if( player.canDel() ){ //注意：延时调用时，前一时刻有没有可能改变状态？
			PlayerMgr::Ins().DelPlayer(id); //注意：延时调用时，前一时刻有没有可能改变状态？ 比如又登录了呢？
		}
	};
	PostFunMgr::Ins().Post(f); /危险做法，但便捷。 因为关服的时候，可能，f引用对象先释放，然后PostFunMgr::Ins()后调用就野对象了

	安全做法：管理类拥有，内部控制对象生命周期，比如
	class StateMgr
	{
		PostFunMgr m_postFunMgr; 
		vector<State> m_vecState;

		void test(){
			auto f=[this](){  //引用this安全，this释放时，m_postFunMgr也释放。 释放结束，有机会下一个timer回调就找不到m_postFunMgr对象，就不会再危险调用了。
				m_vecState.erase();
			};
			m_postFunMgr.Post(f); //延时执行函数
		}
	}
*/

#pragma once

#include <vector>
#include <list>
#include <set>
#include "typedef.h"
#include <functional>
#include <tuple>
#include "../log_file.h"
#include "static_reg.h"
#include "time/su_timer.h"

namespace su
{
	using PostFun = std::function<void(void)>;
	class PostFunMgr
	{
		std::vector<PostFun> m_vec;
		std::vector<PostFun> m_tmpVec;//避免每次构造
		Timer m_timer;//必须进程退出主动执行 TimeDriver::Ins().Clear(); 不然析构可能访问野指针
	public:
		static PostFunMgr& Ins()
		{
			static PostFunMgr obj;
			return obj;
		}

		//注意：延时调用容易引用野对象。用户需要正确控制对象的生存期。 对象成员创造一个 PostFunMgr对象的用法不错，比如 
		/*
			class My
			{
			PostFunMgr m_PostFunMgr;
			void f()
			{
			m_PostFunMgr.Post([this](){});//这里访问this安全
			}
			}
		*/
		void Post(PostFun f);
	private:
		void Excute();
	};

} //end namespace su


//end file
